﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using AteneoLibriBusinessLogic.Entities;
using System.Drawing;
using System.IO;

namespace AteneoLibri
{
    public partial class BookDetails : System.Web.UI.Page
    {

        User user = null;
        Book book = null;
        string idBook = "";
        private static List<Book> bookCollection = new List<Book>();

        protected void Page_PreInit(object sender, EventArgs e)
        {
            if (User.Identity.IsAuthenticated)
            {
                if (User.Identity.Name.Equals(System.Configuration.ConfigurationManager.AppSettings["AdminName"]))
                {
                    Page.MasterPageFile = "~/BackEnd/BackEndMasterPage.Master";
                }
                else
                {
                    Page.MasterPageFile = "~/Account/NewAccountMasterPage.Master";
                }
            }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                idBook = Request.QueryString[0];
                // check if the user come from the search page
                /*
                string fromSearch = Request.QueryString["fromSearch"];

                if (!String.IsNullOrEmpty(fromSearch))
                {
                    if (Session["BOOK_COLLECTION"] != null)
                    {
                        bookCollection.AddRange(Session["BOOK_COLLECTION"] as List<Book>);
                        // enable buttons to move throught the collection
                        pnlButtonsMoveCollection.Visible = true;
                    }
                }
                */
            }
            catch (Exception ex)
            {
                lblTitle.Text = "WARNING";
                // nascondo i dettagli del libro se non ho travato libri
                pnlBookDetails.Visible = false;
                pnlBuyBook.Visible = false;
                pnlManageActivity.Visible = false;
                // libro non trovato in archivio
                pnlWarning.Visible = true;
                lblWarning.Text = "Attenzione il libro selezionato è stato rimosso!";
                                
            }

            user = Utility.HttpSessionManager.GetWebUser();

            if (!idBook.Equals("")) // sto vedendo i dettagli di un libro
            {
                using (wsAteneoLibri.AteneoLibriServiceClient service = new wsAteneoLibri.AteneoLibriServiceClient())
                {
                    // LOAD BOOK PROPERTY
                    book = service.getBookById(new Guid(idBook));
                    if (book != null)
                    {
                        #region LOAD BOOK PROPERY
                        if (book != null)
                        {
                            lblTitle.Text = book.Title;
                            lblAuthors.Text = book.Author;
                            lblPublishingHouse.Text = book.PublishingHouse;
                            lblEdition.Text = book.Edition;
                            lblNote.Text = book.Note;
                            lblSellingPrice.Text = "€ " + book.SellingPrice.ToString("F2");
                            lblInsertDate.Text = book.InsertDate.ToShortDateString();
                            // lblUserName.Text = book.UserName;
                            lnkUserProfile.Text = book.UserName;
                            lnkUserProfile.NavigateUrl = "UserDetails.aspx?UserId=" + book.UserId;

                            string fileName = Path.GetFileName(book.CoverImage);
                            string bookImageDirectory = System.Configuration.ConfigurationManager.AppSettings["BookCoverImageDirectory"];

                            if (book.CoverImage != null && book.CoverImage != "")
                            {
                                CoverImage.ImageUrl = bookImageDirectory + fileName;
                            }
                            else
                            {
                                CoverImage.ImageUrl = "~/Images/no_book_cover.jpg"; // no image
                            }
                        }
                        #endregion

                        List<Sale> sales = service.getSalesByBookId(book.IdBook);
                        bool bookSold = sales.Where(x => x.EndDate != null).Count() > 0;


                        if (user != null) // LOGGED USER
                        {
                            var myBooks = service.getBooksByIdUser(user.IdUser);
                            bool isMyBook = myBooks.Where(x => x.IdBook == book.IdBook).Count() > 0;
                            bool purchasedBook = sales.Where(x => x.EndDate != null && x.UserIdPurchaser.Value == user.IdUser && (x.SoldTo.HasValue && x.SoldTo.Value)).Count() > 0;

                            if (!bookSold) // se non è stato venduto
                            {
                                if (isMyBook) // è un mio libro
                                {
                                    pnlBuyBook.Visible = false;
                                    pnlManageActivity.Visible = true;
                                }
                                else // non è un mio libro
                                {
                                    pnlBuyBook.Visible = true;
                                    pnlManageActivity.Visible = false; // ?!?
                                }
                            }
                            else // se il libro è stato venduto (devo capire a chi è stato venduto)
                            {
                                pnlBuyBook.Visible = false;
                                pnlManageActivity.Visible = false;

                                if (isMyBook) // se è un mio libro
                                {
#if DEBUG
                                    pnlSuccess.Visible = true;
                                    lblSuccess.Text = "Congratulazioni, hai venduto questo libro!";
#endif
                                }
                                else // se non è un mio libro
                                {
                                    if (purchasedBook) // se il libro è stato venduto a me
                                    {
#if DEBUG
                                        pnlSuccess.Visible = true;
                                        lblSuccess.Text = "Complimenti, hai acquistato questo libro!";
#endif
                                    }
                                    else // se è stato venduto a qualcunaltro
                                    {
                                        // Questa scritta compare quando sono loggato, faccio una ricerca ed esce un libro già venduto.
                                        // NOTA: quuesta sezione non avrà più modo di esistere se tolgo i libri venduti dalla ricerca
                                        pnlSuccess.Visible = true;
                                        lblSuccess.Text = "Il libro è stato venduto";                                        
                                    }

                                }
                            }
                        }
                        else // ANONYMOUS USER
                        {
                            pnlManageActivity.Visible = false;

                            if (!bookSold) // Se il libro non è stato venduto
                            {
                                pnlBuyBook.Visible = true;
                            }
                            else // Se il libro è stato venduto
                            {
                                pnlBuyBook.Visible = false;

                                pnlSuccess.Visible = true;
                                lblSuccess.Text = "Il libro è stato venduto";
                            }                            
                        }
                    }
                    else
                    {
                        lblTitle.Text = "WARNING";
                        pnlBookDetails.Visible = false;
                        pnlBuyBook.Visible = false;
                        pnlManageActivity.Visible = false;

                        pnlWarning.Visible = true;
                        lblWarning.Text = "Attenzione il libro selezionato è stato rimosso!";
                    }

                }
            }

        }


        protected void btnModifyBook_Click(object sender, ImageClickEventArgs e)
        {
            string link = System.Configuration.ConfigurationManager.AppSettings["webSiteURL"] + "/Account/InsertBook.aspx?IdBook=" + book.IdBook.ToString();
            Response.Redirect(link);
        }

        protected void btnBuyBook_Click(object sender, ImageClickEventArgs e)
        {
            if (user != null)
            {

                /* Verificare che non ci siano altre richieste in corso da parte dell'utente loggato per il libro selezionato */
                bool existRequest = existPreviousRequest(book);

                if (!existRequest)
                {
                    pnlStartUpMessage.Visible = true;

                    using (wsAteneoLibri.AteneoLibriServiceClient service = new wsAteneoLibri.AteneoLibriServiceClient())
                    {
                        User sellerUser = service.getUserByIdBook(new Guid(idBook));
                        if (sellerUser != null)
                        {
                            txtStartUpMessage.Text = "Ciao " + sellerUser.Username + ",";
                        }
                    }

                    pnlBuyBook.Visible = false;
                }
                else
                {
                    pnlBuyBook.Visible = false;

                    pnlWarning.Visible = true;
                    lblWarning.Text = "Hai già effettuato una richiesta di acquisto per questo libro!";
                }

            }
            else
            {
                Response.Redirect("~/Login.aspx?ReturnUrl=/BookDetails.aspx?IdBook=" + book.IdBook);
            }
        }

        protected void btnAnnulla_Click(object sender, EventArgs e)
        {
            pnlStartUpMessage.Visible = false;
            pnlBuyBook.Visible = true;
        }

        protected void btnInviaRichiesta_Click(object sender, EventArgs e)
        {
            // Devo creare una istanza di vendita, devo recuperare il mio ID se non sono loggato devo loggarmi.
            // Devo notificare al venditore che sono interessato a comprare il libro
            // Gli mando una mail e creo un nuovo messaggio standard che apparirà nelle bacheche di entrambi (Venditore | Compratore)
            if (user != null)
            {

                using (wsAteneoLibri.AteneoLibriServiceClient service = new wsAteneoLibri.AteneoLibriServiceClient())
                {
                    // TODO usare TransactionScope per il doppio inserimento
                    bool result = false;
                    Sale sale = new Sale();

                    sale.IdSale = Guid.NewGuid();

                    sale.StartDate = DateTime.Now;
                    sale.BookId = book.IdBook;
                    sale.UserIdPurchaser = user.IdUser;

                    // Recupero l'Utente che ha inserito il libro
                    User sellerUser = service.getUserById(book.UserId);

                    // Creo un messaggio: 1 per l'acquirente ed uno per il venditore che verranno visualizzati nel pannello delle conversazioni di vendita
                    #region creazione messaggio

                    Message startUpMessage = new Message();

                    startUpMessage.IdMessage = Guid.NewGuid();
                    startUpMessage.UserIdSeller = sellerUser.IdUser;
                    startUpMessage.UserIdPurchaser = user.IdUser;
                    startUpMessage.Date = DateTime.Now;
                    startUpMessage.SaleId = sale.IdSale;
                    startUpMessage.WriteBy = user.IdUser;

                    startUpMessage.TextMessage = txtStartUpMessage.Text.Trim();
                    //startUpMessage.TextMessage = "Messaggio di start-up di una nuova vendita tra il venditore " + sellerUser.Username + " e l'acquirente " + user.Username;

                    #endregion

                    try
                    {
                        result = service.insertSale(sale) && service.insertMessage(startUpMessage);
                    }
                    catch (Exception ex)
                    {
                        Console.WriteLine(ex.Message);
                    }


                    if (result)
                    {
                        try
                        {
                            // Gestione email
                            Utility.Mail.MailSender mailSender = new Utility.Mail.MailSender();
                            // Mail che viene spedita al compratore
                            mailSender.SendMail(user.Email, "Conferma invio richiesta", Utility.Mail.MailText.generatePurchaserBody(sellerUser.Username, book.Title), true);
                            // Mail che viene spedita al venditore
                            mailSender = new Utility.Mail.MailSender();

                            string link = string.Empty;

                            link = System.Configuration.ConfigurationManager.AppSettings["webSiteURL"] + "/Account/Messages.aspx?IdSale=" + sale.IdSale.ToString() + "&PurchaseUserId=" + user.IdUser;

                            mailSender.SendMail(sellerUser.Email, "Richiesta per il libro " + book.Title, Utility.Mail.MailText.generateSellerBody(user.Username, txtStartUpMessage.Text.Trim(), link), true);

                            // TODO creare pannello per avvenuta creazione vendita                            
                            pnlBuyBook.Visible = false;
                            pnlStartUpMessage.Visible = false;

                            pnlSuccess.Visible = true;
                            lblSuccess.Text = "Il tuo messaggio è stato inviato al venditore!";
                        }
                        catch (Exception ex)
                        {
                            // TODO gestire un log con gli errori
                            Page.ClientScript.RegisterStartupScript(this.GetType(), "Errore!", "alert('" + ex.Message + "');", true);
                        }
                    }
                    else
                    {
                        // TODO creare pannello di errore durante la creazione della vendita
                        pnlBookDetails.Visible = false;

                        pnlError.Visible = true;
                        lblError.Text = "Errore durante la generazione della richiesta di vendita!";
                    }

                }
            }

        }

        private bool existPreviousRequest(Book book)
        {
            bool result = false;
            using (wsAteneoLibri.AteneoLibriServiceClient service = new wsAteneoLibri.AteneoLibriServiceClient())
            {
                result = service.existPreviousRequest(user.IdUser, book.IdBook);
            }

            return result;
        }

        protected void btnRemoveBook_Click(object sender, ImageClickEventArgs e)
        {
            using (wsAteneoLibri.AteneoLibriServiceClient service = new wsAteneoLibri.AteneoLibriServiceClient())
            {
                List<Sale> sellsList = new List<Sale>();
                List<User> purchasersList = new List<User>();
                if (book != null)
                {                    

                    // PARTE MODIFICATA SU RICHIESTA DEL 24/03/2013
                    #region PARTE_MODIFICATA
                    /*                    
                    sellsList = service.getSalesByBookId(book.IdBook);
                    
                    if (sellsList.Count() > 0) // vuol dire che ci sono delle richieste di vendita per questo libro
                    {
                        pnlWarning.Visible = true;
                        lblWarning.Text = "Non puoi cancellare il libro in quanto sono state ricevute richieste di acquisto per lo stesso!";
                    }
                    else // cancello il libro
                    {
                        bool result = service.deleteBook(book.IdBook);

                        if (result)
                        {
                            pnlWarning.Visible = true;
                            lblWarning.Text = "Il libro è stato cancellato con successo!";
                        }
                        else
                        {
                            pnlWarning.Visible = true;
                            lblWarning.Text = "Il libro NON è stato cancellato!";
                        }
                    }
                    */
                    #endregion

                    // ORA CANCELLO SIA IL LIBRO CHE LE VENDITE IN CORSO CHE I MESSAGGI (FACENDO ATTENZIONE AI VINCOLI DI INTEGRITà) (deprecata)
                    // Cancello il libro logicamente settando il flag IsDeleted a TRUE
                    book.IsDeleted = true;

                    bool result = service.updateBook(book);

                    if (result)
                    {
                        pnlWarning.Visible = true;
                        lblWarning.Text = "Il libro è stato cancellato con successo!";
                    }
                    else
                    {
                        pnlWarning.Visible = true;
                        lblWarning.Text = "Il libro NON è stato cancellato!";
                    }

                    pnlManageActivity.Visible = false;
                }
            }
        }

        protected void btnPrevious_Click(object sender, EventArgs e)
        {

        }

        protected void btnNext_Click(object sender, EventArgs e)
        {

        }

    }
}